/**************************************************************************/ /**
* @file     load_file.h
* @brief    加载素材 (外置移动存储 -> 板载SPI-Flash -> 芯片内置SDRAM)
* @version  V3.4
* @date     2022.07.21
******************************************************************************/
#ifndef __LOAD_FILE_H__
#define __LOAD_FILE_H__

//===============================================头文件依赖=====================================================//
#include "ff.h"
#include "file_table.h"
#include "mem_sdram.h"
#include "lv_ll.h"

//=================================================宏定义=======================================================//

//================================================类型声明=======================================================//
typedef enum
{
    SD = 0,
    USB,
    SPI
} disk_t; //磁盘类型

typedef enum
{
    img = 0,
    avi,
    wav,
    bin
} f_type_t; //文件类型

//================================================全局变量=======================================================//
extern const char *const VolumeStr[FF_VOLUMES]; // User defied volume ID

//================================================函数声明=======================================================//
/**
 * @brief 	磁盘新建卷, 重置清空卷
 * @param 	disk : 磁盘介质类型
 * @retval	0 : success     > 0 : error code
 * @note	/
 */
uint8_t fs_mkfs(disk_t disk);

/**
 * @brief 	为磁盘卸载文件系统
 * @param 	disk : 磁盘介质类型
 * @retval	0 : success     > 0 : error code
 * @note	/
 */
uint8_t fs_unmount(disk_t disk);

/**
 * @brief 	为磁盘挂载文件系统
 * @param 	disk : 磁盘介质类型
 * @retval	0 : success     > 0 : error code
 * @note	/
 */
uint8_t fs_mount(disk_t disk);

/**
 * @brief 	加载资源至 SDRAM 内(须保持 disk 磁盘挂载文件系统)
 * @param 	disk		: 磁盘盘符
 *			type	    : 文件类型
 *			path	    : 文件路径
 *			source		: 对应资源结构体
 * @retval	0 - success     非0 - error
 * @note	Callback -> sdram_malloc()
 */
uint8_t load_to_sdram_source(disk_t disk, f_type_t type, const char *path, void *source);

/**
 * @brief	拷贝文件
 * @param	src_path	- 源文件绝对路径
 *			dst_path	- 目标文件绝对路径
 * @retval	0 - success     非0 - error
 * @note	优化为连续块
 */
uint8_t copy_file(const char *src_path, const char *dst_path);

/**
 * @brief	按文件链表拷贝文件并显示拷贝过程 UI
 * @param	src_disk	: 源文件磁盘
 * 			dst_disk	: 目标文件磁盘
 * 			file_list	: 文件链表
 * @retval	0 - success     非0 - error
 */
uint8_t show_copying_file_list(const disk_t src_disk, const disk_t dst_disk, lv_ll_t *file_list);

/**
 * @brief	按文件表拷贝文件并显示拷贝过程 UI
 * @param	src_disk	: 源文件磁盘
 * 			dst_disk	: 目标文件磁盘
 * 			file_table	: 文件表
 * 			start_index	: 待拷贝文件起点索引
 * 			num			: 待拷贝文件数量
 * @retval	0 - success     非0 - error
 */
uint8_t show_copying_file_table(const disk_t src_disk, const disk_t dst_disk,
                                const table_class_t *file_table,
                                const uint32_t start_index, const uint32_t num);

/**
 * @brief	按文件表依次验证磁盘文件
 * @param	disk		: 详见 disk_t 枚举
 *			file_table	: 文件表
 * 			start_index	: 文件起点索引
 * 			num			: 文件数量
 * @retval	0-success	非0-error code : 缺失的文件在对应文件表中的索引 + 1 (eg : 0 => 1)
 * @note	校验单个文件使用 f_stat()
 */
uint32_t check_file_table(const disk_t disk, const table_class_t *file_table,
                               const uint32_t start_index, const uint32_t num);

#endif //__LOAD_FILE_H__
